#ifndef _GRID_
#define _GRID_

#include "Point.h"
#include "Dofs.h"
#include <vector>
using namespace std;
/**
 * @brief Grid:意指Mesh中每一个小网格，包含顶点信息和自由度信息。
 * 
 * @tparam int DIM 维度
 */
template<unsigned int DIM>
class Grid
{
protected:
    int num_of_vertices; /*< 顶点的数目*/
    vector<Point<DIM>> vertices;/*< 存储顶点的vector*/
public:
    /**
     * @brief 含参构造函数
     * 
     * @param _pnts 包含顶点的vector,逆时针顺序
     */
     Grid(const vector<Point<DIM>>& _pnts): vertices{_pnts}
     {
	 num_of_vertices = _pnts.size();
     };
     /**
      * @brief 析构函数
      */    
     ~Grid() = default;
     /**
      * @brief 设置grid的顶点，逆时针顺序
      * 
      * @param _pnts 包含顶点的vector,逆时针顺序
      */
     void setVertices(const vector<Point<DIM>>& _pnts)
     {
        vertices.resize(_pnts.size());
        copy(_pnts.begin(), _pnts.end(), vertices.begin());
        num_of_vertices = _pnts.size();
     };
     /**
      * @brief 返回包含顶点信息的vector
      * @return 顶点vector
      */
     const vector<Point<DIM>>& getVertices() const
     {
        return vertices;
     }
     /**
      * @brief 返回第_index个顶点，从1开始
      * 
      * @param _index 顶点的下标
      * @return 第_index个顶点
      */
     const Point<DIM>& getVertices(int _index) const
     {
        return vertices[_index-1];
     };
     /**
      * @brief 返回顶点的个数
      * @return 顶点的个数
      */
     const int& getNumVertices() const
     {
        return num_of_vertices;
     };
};


#else
// Do Nothing
#endif
